在學校的程式相關課程中(資料結構、演算法、物件導向、C/C++程式設計 ...),都沒有使用過Github裡面的開源專案來協助開發,直到大三開始製作實務專題時才首次接觸到,接下來去公司實習、進實驗室接計畫,也經常需要使用到開源專案,但是其軟體規模通常都非常大,也依賴了許多其他第三方的程式庫,這時候就需要使用到CMake來幫助我們管理專案。
在學習CMake的過程中,找到了以下比較有架構與體系、參考價值的資源,其他的基本上都太過於零碎而難以了解全貌。
線上資源:
但是在學習過程中,仍然有許多疑問是這些書籍或教程沒辦法解答的,網路上也搜尋不太到相關的範例(可能是我Google能力太爛),例如說動態庫的版本號,沒有一個範例和我說要如何更新才能實現多版本共存或使用指定版本編譯,但這個功能在軟體實作上卻非常重要,因為第三方函式庫會一直更新,很容易陷入相依性地獄中。
而且上述的教學內容雖然完整且詳細,但是大部分都沒有實際案例,有時會不知道它所介紹的CMake語法的應用場景為何,等到需要使用時早已忘光概念。
因此這個旅程將以開發專案與實際應用的視角來學習CMake,但是內容將不僅限於CMake的使用,我也會分享在開發專案過程中所遇到的問題與解決方案,順便還一下以前欠下的知識債(Knowledge Debt)。
接下來是我預計要撰寫的章節介紹
第一章 [Day3] 編譯流程 : 簡介預處理 (pre-processing)、編譯 (compilation)、彙編 (assembly) 與鏈接 (linking)的流程。
第二章 編譯單一原始碼
第三章 編譯多檔案
3.1. [Day6] 編譯多檔案與檔案架構:要編譯多檔案就必須要知道鏈接(Linking)的原理,雖然在第一篇中有說明過,但是在這裡要重點強調。
3.2. [Day7] 定義與宣告—多檔案共用變數:要在多檔案間共用變數需要關鍵字extern,但是這篇會將重點放在extern的實現原理:定義與宣告的差異。
3.3. [Day8] 重複定義問題-Define Guard:在使用多檔案時必須使用Define Guard,否則會遇到重複定義問題,因此這篇會說明原理。
3.4. [Day9] 子目錄:專案規模越來越大目錄架構會更加複雜,因此每一層目錄中最好都要有CMakeLists.txt來負責管理,這篇會說明如何在各個目錄中將原始碼編譯成庫,並且在最後鍊結成執行檔。
第四章 庫
第五章 版本與安裝
5.1. [Day12] 動態庫與版本號:以CAN BUS Driver為例,介紹動態庫的版本號是如何實現的原理,怎麼使用軟鍊結管理不同版本,以及各版本之間的兼容性原理-ABI二進制接口。
5.2. [Day13] 實際操作動態庫的版本號:為了更熟悉動態庫的特性,會從編譯出帶版本號的動態庫,接下來依序更新補釘版本、次要版本、主要版本。
5.3. [Day14] 從原始碼安裝庫:庫有兩種安裝方式,一種是直接安裝在專案內部,另外一種是安裝到系統目錄下。
5.4. [Day15] 解除安裝庫:能安裝,當然要能刪除啦!
5.5. [Day16] 使用包管理器管理庫:將自己的庫打包成 .deb 安裝檔後使用Linux的包管理器管理安裝的檔案,並比較從 原始碼安裝庫 和 使用包管理器安裝庫 各自的優缺點。
5.6. [Day17] 發布軟體流程:ABI Cheacker->Release:發布軟體前,先用debug模式編譯,讓ABI Checker來檢測二進制接口是否損壞,來保證庫的向後兼容性,接下來用release模式編譯後發布。
5.7. [Day18] 版本號與宏:如何使用.h.in參數檔讓CMake產生宏(Marco)來當作版本號。
第六章 製作與使用第三方庫
第七章 測試與除錯專案
第八章 CMake 常用語法補充
其他(不確定要不要放)